package finish

import (
	"log"
	"os"
	"utils/ginRoute"
	"utils/grpcUtils"
	"utils/tools/logUtils"
)

type Cthulhu struct {
	configPath    string
	watchFilePath []string
	es            *ginRoute.GinEngine
	grpc          *grpcUtils.GrpcServer
}

type Option func(*Cthulhu)

func init() {
	logUtils.LogPrintln(2, "begin")
}
func NewFinishedHouse(options ...Option) *Cthulhu {
	/*
		默認設置
	*/
	h := &Cthulhu{
		configPath: "/cmd/cmd.toml",
	}
	for _, option := range options {
		option(h)
	}
	return h
}
func SetGinEngin(es *ginRoute.GinEngine) Option {
	return func(h *Cthulhu) {
		h.es = es
	}
}
func SetGinGrpc(grpc *grpcUtils.GrpcServer) Option {
	return func(h *Cthulhu) {
		h.grpc = grpc
	}
}

//func SetConfigPath(root, path string) Option {
//	return func(h *Cthulhu) {
//		h.configPath = filepath.Join(root, path)
//		var_.ConfigViper = cmd.NewConfigViper(h.configPath)
//		var_.GormDb, var_.MongoClient, var_.RedisClient = cmd.GetAllClient(var_.ConfigViper)
//	}
//}
//func SetWatchPath(path ...string) func(h *Cthulhu) {
//	var_.Watcher, _ = fsnotify.NewWatcher()
//	return func(h *Cthulhu) {
//		h.watchFilePath = path
//	}
//}

//	func (c *Cthulhu) WatchDirs(root string) *Cthulhu {
//		for _, s := range c.watchFilePath {
//			dir := filepath.Dir(filepath.Join(root, s))
//			if fileUtils.CreatIfNotExist(dir) {
//				fileUtils.WatchDir(var_.Watcher, fileUtils.WalkFile(dir))
//			}
//		}
//		return c
//	}
func (c *Cthulhu) RunServer(port string) {
	if c.es != nil {
		c.es.RunEngine(port)
	} else {
		logUtils.Log(1, "Not Set Gin Server")
	}
}
func (c *Cthulhu) RunGrpcServer(port string) {
	if c.grpc != nil {
		c.grpc.RunGrpcServer(port)
	} else {
		logUtils.Log(1, "Not Set Gin Server")
	}
}
func (c *Cthulhu) CreatDir() {
	err := os.MkdirAll("cmd", os.ModePerm)
	if err != nil && !os.IsExist(err) {
		log.Fatal(err)
	}
	os.MkdirAll("static/public", os.ModePerm)
	os.MkdirAll("static/upload", os.ModePerm)
}
